'use strict';

let { Sequelize, DataTypes } = require('sequelize');
let { database, username, password, host, dialect } = require('./config')

// 初始化sequelize实例，注意Sequelize和sequelize的大小写区别
let sequelize = new Sequelize(database, username, password, {
    host: host,
    dialect: dialect
});

// 定义一个方法，用来统一模型定义
function defineModel(name, attrs) {
    let prop = {};

    prop.id = {
        type: DataTypes.BIGINT,
        primaryKey: true,
        autoIncrement: true
    }

    for (let key in attrs) {
        let value = attrs[key];
        prop[key] = value;
    }

    prop.createdAt = {
        type: DataTypes.BIGINT,
        allowNull: false
    };
    prop.updatedAt = {
        type: DataTypes.BIGINT,
        allowNull: false
    };
    prop.version = {
        type: DataTypes.INTEGER,
        allowNull: false
    };
    prop.remarks = {
        type: DataTypes.STRING(800),
        allowNull: true
    };


    let User = sequelize.define(name, prop, {
        tableName: name,
        timestamps: false,
        // 定义勾子
        hooks: {
            // 在数据插入时，在对将要插入的数据进行验证之前（能否为空、默认值、是否唯一等约束进行验证的时候）
            beforeValidate: function (obj) {
                // 生成一个时间戳
                let nw = Date.now();
                // 如果是新插入数据，则创建时间和更新时间一样，并且版本设置为0；如果是更新数据，则更新时间重新赋值，并对版本自增1
                if (obj.isNewRecord) {
                    obj.createdAt = nw;
                    obj.updatedAt = nw;
                    obj.version = 0;
                } else {
                    obj.updatedAt = nw;
                    obj.version += 1;
                }
            }
        }
    });


    return User;
}

// 准备将Sequelize的一个实例、模型定义方法、数据类型
let obj = {
    sequelize,
    defineModel,
    DataTypes
}

// 暴露这个对象
module.exports = obj;